home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2002 #11 / Amiga Plus CD - 2002 - No. 11.iso / Tools / MorphOS / tictactoe-1.2.1 / tictactoe.c < prev    next >
C/C++ Source or Header  |  2002-10-22  |  3KB  |  95 lines

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>  /* declaration of malloc(), calloc() */
  4. #include "messages.h"
  5. #include "t3types.h"
  6. #include "t3visual.h"
  7. #include "moves.h"
  8.  
  9. void create_board() {
  10.     int row;
  11.     signed char *cbuf;
  12.     int *ibuf;
  13.  
  14.     board = (signed char **)malloc(SIZE * sizeof(signed char *));
  15.     scores = (int **)malloc(SIZE * sizeof(int *));
  16.     cbuf = (signed char *)calloc(SIZE * SIZE, sizeof(signed char));
  17.     ibuf = (int *)calloc(SIZE * SIZE, sizeof(int));
  18.     if(board == NULL || scores == NULL || cbuf == NULL || ibuf == NULL) {
  19.         print_error("malloc() failure");
  20.         exit(1);
  21.     }
  22.  
  23.     for(row=0; row<SIZE; row++) {
  24.         board[row] = &cbuf[SIZE * row];
  25.         scores[row] = &ibuf[SIZE * row];
  26.     }
  27. }
  28.  
  29. void set_params(int argc, char *argv[]) {
  30.     int i;
  31.     int b_size;
  32.  
  33.     if(argc==1) 
  34.         fprintf(stderr,"\nUse --help flag to get help\n\n");
  35.     else
  36.         for(i=1; i<argc; i++)
  37.             if(!strcmp(argv[i], "--debug"))
  38.                 debug=1;
  39.             else if(!strcmp(argv[i], "--help")) 
  40.                 fprintf(stderr, "\n\nTicTacToe v 1.new\n---------------\nCopyright (c) 2001 Philip S Tellis\n\nUsage: %s [--help] [--debug] [X|O] [size]\n\n-------------------------------------------------------------\n\nOptions:\n\n   --help\t\tprint this message\n   --debug\t\tprint debugging information to stderr\n     X\t\t\tcomputer plays first\n     O\t\t\tuser plays first (default)\n     size\t\tdesired board size, non-negative, odd integer (default: 3)\n\n--------------------------------------------------------------\n\n\n", argv[0]);
  41.             else if(!strcmp(argv[i], "X") && !YOU)
  42.                 YOU=X, ME=O;
  43.             else if(!strcmp(argv[i], "O") && !YOU)
  44.                 YOU=O, ME=X;
  45.             else if(sscanf(argv[i], "%d", &b_size) == 1) {
  46.                 if(b_size < 0 || (b_size%2==0 && b_size!=0)) {
  47.                     print_error("board size must be positive, odd integer\n");
  48.                     exit(1);
  49.                 }
  50.                 SIZE = b_size;
  51.             }
  52.  
  53.     if(!YOU)
  54.         YOU=O, ME=X;
  55. }
  56.  
  57. void make_move(int pos, int who) {
  58.     board[pos/SIZE][pos%SIZE]=who;
  59. }
  60.  
  61. enum players play_game() {
  62.     enum players result=NONE;
  63.     int (*_get_move[3])()={get_your_move, NULL, get_my_move};
  64.     int (**get_move)();
  65.     int who=NONE;
  66.     
  67.     print_debug("Let's play");
  68.  
  69.     get_move = &_get_move[1];    /* so that I can subscript
  70.                        get_move from -1 to +1 */
  71.  
  72.     who=YOU;    /* If YOU == O (-1), then get_your_move is first
  73.                If YOU == X (+1), then get_my_move is first */
  74.  
  75.     show_board();
  76.     for(; !(result=end_of_game()); who*=-1) {
  77.         make_move(get_move[who](), who);
  78.         show_board();
  79.     } 
  80.  
  81.     return result;
  82. }
  83.  
  84. int main(int argc, char *argv[]) {
  85.     enum players result=NONE;
  86.  
  87.     set_params(argc, argv);
  88.     create_board();
  89.  
  90.     result = play_game();
  91.     show_result(result);
  92.  
  93.     return (int)result;
  94. }
  95.